import axios, {type AxiosResponse, type InternalAxiosRequestConfig,} from "axios"
import qs from "qs"
import {Md5} from "ts-md5";

let deviceInfo = ""

function device() {
    if (deviceInfo == "") {
        // 定义MD5对象
        let md5: any = new Md5()
        md5.appendAsciiStr(navigator.userAgent.toString())
        deviceInfo = md5.end()
    }
    return deviceInfo
}

// 创建 axios 实例
const apidata = axios.create({
    baseURL: import.meta.env.VITE_APP_API_URL,
    timeout: 10000,
    headers: {
        "Content-Type": "application/json;charset=utf-8"
    },
    paramsSerializer: (params) => {
        return qs.stringify(params);
    },
});

// 请求拦截器
apidata.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
        let accessToken = getToken();
        if (accessToken) {
            config.headers.info = accessToken;
        }
        config.headers.token = rsacoder.encryptDevice(device())
        return config;
    },
    (error: any) => {
        return Promise.reject(error);
    }
);

// 响应拦截器
apidata.interceptors.response.use(
    (response: AxiosResponse) => {
        // 检查配置的响应类型是否为二进制类型（'blob' 或 'arraybuffer'）, 如果是，直接返回响应对象
        if (
            response.config.responseType === "blob" ||
            response.config.responseType === "arraybuffer"
        ) {
            return response;
        }

        let {flag, code, msg, data} = response.data;
        if (flag || (code === ResultEnum.SUCCESS)) {
            return data;
        }
        if (code === ResultEnum.ERROR) {
            ElMessage.error(msg || "系统出错");
        }
        return Promise.reject(new Error(code || ResultEnum.ERROR))
    },
    error => {
        // 对响应错误做点什么
        if (error.response) {
            switch (error.response.status) {
                case 401:
                    // 未授权，可以重定向到登录页面
                    ElMessage.error('未授权，请登录');
                    break;
                case 403:
                    // 禁止访问
                    ElMessage.error('禁止访问');
                    break;
                case 404:
                    // 请求的资源未找到
                    ElMessage.error('资源未找到');
                    break;
                case 500:
                    // 服务器错误
                    ElMessage.error('服务器错误');
                    break;
                default:
                    ElMessage.error('请求出错: ' + error.response.statusText);
            }
        } else if (error.request) {
            // 请求已发出，但没有收到响应
            ElMessage.error('请求超时');
        } else {
            // 其他错误
            ElMessage.error('请求出错: ' + error.message);
        }
        return Promise.reject(error);
    }
);

export default apidata;
